/*
 * SPDX-FileCopyrightText: 2024 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

@file:OptIn(ExperimentalUnsignedTypes::class)

package com.sanji.audio_test.format

import android.media.MediaFormat
import java.io.FileDescriptor

/**
 * AMR-WB (自适应多速率宽带) 音频格式实现类
 * 
 * AMR-WB 是一种专为宽带语音编码设计的音频格式，采样率为 16kHz，
 * 支持多种比特率，提供比 AMR-NB 更高的音频质量。
 */
class AmrWbFormat : Format() {
    /** 格式名称 */
    override val name: String = "AMR-WB"
    
    /** 容器 MIME 类型 */
    override val mimeTypeContainer: String = MediaFormat.MIMETYPE_AUDIO_AMR_WB
    
    /** 音频 MIME 类型 */
    override val mimeTypeAudio: String = mimeTypeContainer
    
    /** 是否支持直通模式 */
    override val passthrough: Boolean = false
    
    /** 
     * AMR-WB 格式参数信息
     * 
     * AMR-WB 支持的比特率范围为 6,600 到 23,850 比特/秒
     * 默认比特率为 23,850 比特/秒
     * 实际支持的比特率包括: 6,600, 8,850, 12,650, 14,250, 15,850, 18,250, 19,850, 23,050, 23,850 比特/秒
     * 当前只列出部分常用比特率作为示例
     */
    override val paramInfo: FormatParamInfo = RangedParamInfo(
        RangedParamType.Bitrate,
        6_600u..23_850u,
        23_850u,
        // AMR-WB 仅支持 9 种可能的比特率。如果用户选择的比特率不是这 9 种之一，
        // Android 系统将回退到 23050 比特/秒。
        uintArrayOf(
            6_600u,
            15_850u,
            23_850u,
        ),
    )
    
    /** 
     * 采样率信息
     * 
     * AMR-WB 标准采样率为 16kHz
     */
    override val sampleRateInfo: SampleRateInfo =
        SampleRateInfo.fromCodec(baseMediaFormat, 16_000u)

    /**
     * 更新媒体格式参数
     * 
     * @param mediaFormat 媒体格式对象
     * @param param 指定的比特率参数
     */
    override fun updateMediaFormat(mediaFormat: MediaFormat, param: UInt) {
        mediaFormat.apply {
            val channelCount = getInteger(MediaFormat.KEY_CHANNEL_COUNT)
            // 设置比特率，需要乘以声道数
            setInteger(MediaFormat.KEY_BIT_RATE, param.toInt() * channelCount)
        }
    }

    /**
     * 创建 AMR 容器实例
     * 
     * @param fd 文件描述符
     * @return AmrContainer 实例 (宽带模式)
     */
    override fun getContainer(fd: FileDescriptor): Container = AmrContainer(fd, true)
}